package top.mccat.filesystem.utils.menu;

import lombok.extern.slf4j.Slf4j;
import top.mccat.filesystem.bean.FileMenu;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author JMY
 * @Description TODO
 * @Version 1.0.0
 * @Date 2023/2/27 10:45
 * @Created by JMY
 */
@Slf4j
public class MenuUtils {
    /**
     * 递归获取子菜单
     * @param root 当前菜单
     * @param all sql查询到的总数据
     * @return 子菜单
     */
    public static List<FileMenu> getChildren(FileMenu root, List<FileMenu> all) {
        List<FileMenu> children = all.stream()
                // 根据 父菜单 ID 查找当前菜单 ID，以便于找到 当前菜单的子菜单
                .filter(menu -> menu.getParentId().equals(root.getId()))
                // 递归查找子菜单的子菜单
                .map((menu) -> {
                    menu.setChildren(getChildren(menu, all));
                    return menu;
                })
                // 把处理结果收集成一个 List 集合
                .collect(Collectors.toList());
        return children;
    }

    /**
     * 构建父树
     * @param fileMenus 所有menu
     * @return 没有子menu的最高menu树
     */
    public static List<FileMenu> buildTopMenu(List<FileMenu> fileMenus){
        List<FileMenu> topMenu = new ArrayList<FileMenu>();
        for(FileMenu menu : fileMenus){
            if(menu.getParentId().equals(0)){
                topMenu.add(menu);
            }
        }
        return topMenu;
    }

    /**
     * 构建父树
     * @param fileMenus 所有menu
     * @param topMenu 第二级menu
     * @return 没有子menu的父menu树
     */
    public static List<FileMenu> buildRootMenu(FileMenu topMenu,List<FileMenu> fileMenus){
        List<FileMenu> rootMenu = new ArrayList<FileMenu>();
        for(FileMenu menu : fileMenus){
            if(menu.getParentId().equals(1)){
                rootMenu.add(menu);
            }
        }
        topMenu.setChildren(rootMenu);
        return rootMenu;
    }

    /**
     * 构建子树
     * @param rootMenu 父menu
     * @param fileMenus 所有menu列表
     * @return 父menu
     */
    public static FileMenu buildChildMenu(FileMenu rootMenu, List<FileMenu> fileMenus){
        List<FileMenu> children = new ArrayList<FileMenu>();
        for(FileMenu menu : fileMenus){
            if(rootMenu.getId().equals(menu.getParentId())){
                children.add(menu);
            }
        }
        rootMenu.setChildren(children);
        return rootMenu;
    }

    /**
     * 构建树方法
     * @return 完整menu
     */
    public static List<FileMenu> buildMenu(List<FileMenu> fileMenus){
        //构建top菜单
        List<FileMenu> menus = buildTopMenu(fileMenus);
        //构建root菜单
        for(FileMenu menu : menus){
            List<FileMenu> rootMenu = buildRootMenu(menu, fileMenus);
            //构建最终子菜单
            for(FileMenu root : rootMenu){
                buildChildMenu(root, fileMenus);
            }
        }
        return menus;
    }
}
